package com.shang.activemq.first;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

import java.io.IOException;

import static javax.jms.Session.AUTO_ACKNOWLEDGE;

public class JmsConsumer {

    public static final String ACTIVEMQ_URL = "tcp://192.168.0.113:61616";
    public static final String QUEUE_NAME = "QUEUE01";

    public static void main(String[] args) throws JMSException, IOException {
        //1.创建连接工厂,按照给定的url地址，采用默认用户名和密码
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
        //2.通过连接工厂，获得connection并启动访问
        Connection connection = activeMQConnectionFactory.createConnection();
        connection.start();
        //3.创建回话session
        //参数：事务 签收
        Session session = connection.createSession(false, AUTO_ACKNOWLEDGE);
        //4.创建目的地（具体是队列还是主题topic）
        Queue queue = session.createQueue(QUEUE_NAME);

        //5.创建消费者
        MessageConsumer messageConsumer = session.createConsumer(queue);

        /**
         * 同步阻塞方式receive()
         * 订阅者或者接收者调用MessageConsumer的receive()方法来接受消息，receive方法在能够接收到消息之前（或超时之前）将一直阻塞
         */
//        while (true){
//            TextMessage textMessage = (TextMessage) messageConsumer.receive();
//            if (null != textMessage){
//                System.out.println("-----接受到消息: " + textMessage.getText());
//            }else {
//                break;
//            }
//
//        }


        //通过监听的方式来消费消息
        /**
         * 异步非阻塞方式（监听器onMessage()）
         * 订阅者或接收者通过messageConsumer的setMessageListener(MessageListener listener)注册一个消息监听器
         * 当消息到达后，系统自动调用监听器MessageListener的onMessage(Message message)方法
         */
        messageConsumer.setMessageListener(new MessageListener() {
            @Override
            public void onMessage(Message message) {
                if (null != message && message instanceof TextMessage){
                    TextMessage textMessage = (TextMessage) message;
                    try {
                        System.out.println(textMessage.getText());
                        System.out.println(textMessage.getStringProperty("c01"));
                    } catch (JMSException e) {
                        e.printStackTrace();
                    }
                }
                if (null != message && message instanceof MapMessage){
                    MapMessage mapMessage = (MapMessage) message;
                    try {
                        System.out.println(mapMessage.getString("k1"));
                    } catch (JMSException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
        System.in.read();

        //顺着申请 倒着关闭
        messageConsumer.close();
        session.close();
        connection.close();

        /**
         * 先启动2个消费者，再启动生产者---》 消费者一人一半
         */
    }
}
